#!/usr/bin/env python
# coding: utf-8

# * 记录人：陈斯敏
# * 时间：20121-11-29
# * week14
# * 主要参考文档：
# > 1.python官方文档
# > 2.博客-函数
# 

# # 本周内容
# > 1.函数的定义
# 
# > 2.如何使用函数
# 
# > 3.函数的返回值
# 
# > 4.使用注释改进文档
# 
# > 5.传递任意数量的实参
# 
# > 6.函数与模块
# 

# ## 1.函数的定义
# 
# > 1. def 定义函数的第一步
# > 2. def function_name
# >> 1. function_name 遵循变量名称定义的规则
# > 3. 函数名称后加上"():": def function_name(): ===> f(x) = 2x
# 
# * 书写函数体
# >1.函数的注释
# 
# >2.写函数的具体操作（函数题）
# 
# >3.注意：函数也是需要有tab建的间距
# 
# * 使用函数（函数的调用）：
# 
# >1.function name()

# In[27]:


def fib(n): # write Fibonacci series up to n
    """Print a Fibonacci series up to n. """
    a,b = 0,1
    while a < n:
        print(a,end='')
        a,b = b, a+b
        print()


# In[28]:


fib(10)


# In[29]:


help(fib)


# In[ ]:


## 尝试：写一个实现hello world的函数


# In[4]:


def hello():
    """打印hello world"""
    print("hello world!")
    


# In[5]:


hello()


# In[ ]:


## 思考函数的意义？
# 1.可以通过调用函数的方式实现某个功能，使用人不需要考虑数代码内容
# 2. 节省时间，提高应用效率
# 3.函数移一旦定义，就按照一定的规则重复使用


# In[6]:


# 定义了一个名字叫"search4vowels"函数
def search4vowels(word):
    """
    打印文本中出现的元音字母
    亲输入你想要查询的文本内容
    """
    vowels = set('aeiou')
    found = vowels.intersection(set(word)) #交集运算
    print(found)


# In[7]:


help(search4vowels)


# In[10]:


search4vowels("bgfhje")


# In[11]:


vowels = set('auiou')
word = input("Provide a word to search for vowels:")
found = vowels.intersection(set(word))
found


# 下面的方法是不是太重复了，主要原因是没有对重复功能的代码块有特殊的定义（如：名称，注释等）

# In[30]:


vowels = set('aeiou')
word = input("Provide a word to search for vowels:")
found = vowels.intersection(set(word))
found


# In[33]:


vowels = set('aeiou')
word = input("Provide a word to search for vowels:")
found = vowels.intersection(set(word))
found


# # 3.函数的参数
# 
# <font style="color:red">注意：函数的参数可以没有，如果有参数，则如下（分为形式参数和实际参数）：</font>
# 
# >1.形式参数
# >>1.在定义过程中，函数的参数为形式参数
# >2.实际参数
# >>2.调用参数的过程中，函数的参数为实际参数

# In[35]:


# 函数是可以没有参数的
hello()


# In[6]:


# 定义函数
def greet_user(username):    
    """显示简单的问候语，输入你的名字"""    
    print("hello,"+ username.title()+"!") 


# In[8]:


# 调用函数：　username　= "simin"
greet_user("simin")


# # 当参数不止一个时：
# > 1.位置参数(positional argument)
# 
# >> 1.形式参数有多个值，如果实际参数直接赋值，要按照形式参数的先后顺序，这种方式称：位置参数赋值
# 
# >> 2.在调用函数过程中需要考虑如下：
# >>> 1.考虑位置
# >>> 2.考虑个数
# 
# > 2.关键字参数
# >> 1.在调用函数时使用，我们直接在实参中 用赋值的方式去定义形参
# >> 2.不需要考虑顺序，因为赋值已经确定了形式参数的值
# 
# > 3.默认参数
# >> 1.默认参数写在 形式参数中（预计有大量的调用会使用到的值，可以预先设置）
# >> 2.默认参数存在的话，实际调用过程中可以省略赋值的过程

# In[12]:


# 请注意，有两个参数
def describe_pet(animal_type,pet_name):
    """显示宠物信息"""
    print("\nI have a " + animal_type + ".")
    print("My " + animal_type + "'s name is "+pet_name.title() + ".")


# In[13]:


describe_pet("dog","豆豆")


# In[15]:


describe_pet("cat","mimi")


# In[16]:


# 关键字参数
describe_pet(animal_type="dog",pet_name="豆豆")


# In[17]:


describe_pet(pet_name="豆豆",animal_type="dog")


# In[18]:


# 默认参数(写在形式参数中的)
def describe_pet(pet_name,animal_type="dog"):
    """显示宠物信息，animal_type 的默认值 'dog'"""
    print("\nI have a " + animal_type + ".")
    print("My " + animal_type + "'s name is "+pet_name.title() + ".")


# In[19]:


describe_pet("豆豆","dog")


# # 实操和注意（参数部分）positional argument follows keyword argument
# > 1.如果想 关键字参数 和 位置参数共同使用
# >> 1.positional argument follows keyword argument(位置参数需要放在关键字参数的前面)
# >> 2.关键字参数放在末尾（均是关键字，不考虑顺序）
# > 2.默认参数
# >> 1.non-default argument follows default argument(非默认参数需要放在默认参数的前面)
# >> 2.默认参数放在末尾（均是默认参数，不考虑顺序

# In[20]:


#eg1 
def func_test(x,y):
    print(x)
    print(y)
    
func_test(x=1,2)      #？


# In[21]:


#eg2
def func_test(x,y,z):
    print(x)
    print(y)
    print(z)
    
func_test(2,1,z=3) 


# In[22]:


#eg3
def func_test(x,y=4,z):
    print(x)
    print(y)
    print(z)
    
func_test(2,1,3)


# In[24]:


#eg3
def func_test(x,z,y=3):
    print(x)
    print(y)
    print(z)
    
func_test(2,3,5) 


# In[ ]:




